package com.tjetc;

import java.util.ArrayList;
import java.util.List;

@SuppressWarnings("all")
public class _1Generic {
    public static void main(String[] args) {
        /*
            1.泛型：编译期检查，运行时时不检查的（所以可以通过反射来破解）
            原则：
                1. 我们在使用集合的时候以后都使用泛型（我们用的最多的）
                2. 自定义泛型 3种 能看懂
                3. 泛型的继承和通配符 能看懂
            引入：
                1. 请编写程序，在ArrayList中，添加3个Dog对象
            问题：
                1.我们在存放数据时，存的是🐶，取的是Object, 需要进行强制类型转换 有可能ClassCastException
                    所以就需要我们程序员在取出的时候 都要做好类型判断才能使用，防止类型转换异常
                  这样做就很麻烦！！！
                2. 任何事物都能放！！！ 取出的时候还是对象 还是会有类型转换
                3. 不断的进行类型转换 也会影响效率

                我们平时放东西 都是按类分
                好处：我们放进去的是🐶 拿出来的一定是🐶
             使用泛型：
                基本语法：
                List<类型> list = new ArrayList<类型>(); // 这种写法是JDK1.5
                List<类型> list = new ArrayList<>();  // JDK1.8 这么写 我们推荐使用这种写法 类型会自动推断
         */

        List list = new ArrayList();
        // 添加数据
        list.add(new Dog());
        list.add(new Dog());
        Object o = list.get(0);
        Dog dog = (Dog) list.get(0);
        // 任何类型都能放
        list.add(new Cat());

        // 这个集合我单独放🐶
        List dogs = new ArrayList();
        // 这个集合我单独放🐱
        List cats = new ArrayList();

        // 如果别人拿到这个集合 就不一定知道这个集合中存放的到底是🐶还是🐱
//        Dog dog1 = (Dog) cats.get(0);

        // 使用泛型解决上述问题：
//        List<Dog> dogList = new ArrayList<Dog>();
        List<Dog> dogList = new ArrayList<>();
        dogList.add(new Dog());
        //dogList.add(new Cat()); // 此时🐱类已经放不进去了 会报出编译时异常 防止乱放。
        Dog dog2 = dogList.get(0); // 由于限定了这个集合只能放🐶 拿出来的时候就一定是🐶

    }
}

class Dog {}

class Cat {}